import fs from "fs";
import { log } from "@juzi/wechaty";
import dayjs from "dayjs";
import { fileURLToPath } from "url";
import { FileBox } from "file-box";
import { isAddRoom, isRoomName, isChuxing } from "./mRoom.js";
import { SocketTypeEnum, mainType } from "../websocket/socketTypeEnum.js";
import getEventBus from "../utils/eventBus.js";
import path from "path";
import ffmpeg from "fluent-ffmpeg";
// import { ossUplaod } from "../utils/ossUpload.js";
import { getMp3Stream } from "../utils/ffmpeg.js";
var wechatyMsg;
// console.log("isAddRoom", isAddRoom);
// const responseTemplates = JSON.parse(
//     fs.readFileSync("./src/server/assets/response_templates.json", "utf-8")
// );
// eventBus.on("wsMseeage", (data) => {
//   console.log("内部自己触发1--------------", data);
//   console.log("wechatyMsg", wechatyMsg);
// });

// 获取当前目录名
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const sanitizeFileName = (name) => {
  return name.replace(/[<>:"/\\|?*]/g, "_"); // 替换非法字符
};
// console.log(responseTemplates);
const mMsg = async (msg, bot, sendMessageToAll) => {
  wechatyMsg = msg;
  // console.log("StarterBot接受到的信息", msg);
  //获取到的被 艾特 的用户信息
  const chatMentionList = await msg.mentionList();
  // 存在被 @ 的信息
  if (chatMentionList.length) {
    // 聊天记录中被 @ 并且筛选出是 公司企业微信账号员工
    const isCoworkerUserList = chatMentionList.filter(
      (i) => i.payload.coworker
    );
    // console.log("获取到的被@的企业微信员工账号信息:", isCoworkerUserList);
  }
  sendMessageToAll({
    Type: SocketTypeEnum.Console,
    Data: `StarterBot接受到的信息: ${msg}`,
  });

  const sender = msg.talker(); // 获取发送者
  /**获取消息所在的微信群，如果这条消息不在微信群中，会返回 null */
  const room = msg.room();
  // console.log("群信息", msg.room());

  /**群聊 */
  if (room) {
    console.log(
      "发送者的昵称:",
      msg.from(),
      msg.room(),
      JSON.stringify(msg),
      // msg.from().payload.name,
      msg.id,
      msg.type(1)
    );

    // console.log(`房间: ${await msg.room().topic()},Id: ${msg.room().id}`);
    // console.log(`发送者: ${msg.talker().name()},Id: ${msg.talker().id}`);
    // console.log(`消息内容: ${msg.text()}`);
    const messageText = msg.text();
    // 定义正则表达式来匹配引用格式
    const regexQuoted = /「(.*?)」/; // 匹配引号内的内容
    // 使用正则表达式匹配分隔符后面的内容
    const regexText = /- - - - - - - - - - - - - - -\s*(.*)$/;
    const matchQuoted = messageText.match(regexQuoted);
    const matchText = messageText.match(regexText);
    let quoted = null;
    let text = messageText;
    // console.log(msg.talker().payload);
    if (matchQuoted) {
      // 如果匹配成功，提取引用和文本
      quoted = matchQuoted[1]; // 引用部分
      text = matchText[1]; // 文本内容
    }

    // console.log(`引用消息内容: ${quot ed}`);
    // console.log(`消息内容: ${text}`);
    // console.log(
    //   "消息接收日期时间",
    //   msg.date(),
    //   dayjs(msg.date()).format("YYYY-MM-DD HH:mm:ss")
    // );
    //数据类型
    // const mainType = {
    //   text: 0,
    //   image: 1,
    //   video: 2,
    //   documents: 3,
    //   Audio: 4,
    // };
    console.log(messageText.match(regexQuoted), regexQuoted);
    const fd = {
      ContentId: msg.id, // 腾讯标识id
      QuoteId: msg.payload.quoteId, //有的话是引用
      GroupId: msg.room().id, // 群聊id (必传)
      GroupName: await msg.room().topic(), // 群聊名称 (必传)
      SendUserId: msg.talker().id, // 发送人id (必传)
      SendUserName: msg.talker().name(), // 发送人名称 (必传)
      TargetUserId: "", // 接收人id (可选，默认不传)
      TargetUserName: "", // 接收人名称 (可选，默认不传)
      Content: text, // 文本 (必传)
      QuoteContent: quoted, // 引用文本文本 (可选，默认不传)
      ContentType: mainType.text, // 文本类型 (必传，默认0为文本)
      IsAt: Number(await msg.mentionSelf()), // 是否被@ (必传，默认0为否)
      IsAnswer: 0, // 是否回答 (必传，默认0为未回答)
      Time: dayjs(msg.date()).format("YYYY-MM-DD HH:mm:ss"), // 时间 (必传，默认当前时间)
      FactoryId: 0, // 工厂编号 (可选，默认不传)
      Keywords: "", // 关键词 (可选，默认不传)
      OrderNumber: "", // 工单号 (可选，默认不传)
      Phone: "", // 手机号 (可选，默认不传)
      ThirdNumber: "", // 三方工单号 (可选，默认不传)
      ExpressNumber: "", // 快递单号 (可选，默认不传)
      Answer: "", // 回复文本 (可选，默认不传)
      SendUserAvatar: msg.talker().payload.avatar, //头像
      SendRealName: msg.talker().payload.realName, //真实姓名
      SendHandle: msg.talker().payload.handle, //企业微信账号
      SendCoworker: msg.talker().payload.coworker, //是否是企业微信账号·
      SendTimeStamp: msg.payload.timestamp, //该条记录的时间戳
    };
    // 存在回复内容 && 回复的信息类型为 '文本'
    if (msg.text() && msg.type() === bot.Message.Type.Text) {
      sendMessageToAll({
        Type: SocketTypeEnum.RecordMsg,
        Data: JSON.stringify(fd),
      });
    }

    if (msg.type() == bot.Message.Type.Image) {
      // console.log(await msg.toFileBox());
      const fileBox = await msg.toFileBox();
      // console.log("获取到的文件流:", fileBox);
      // console.log(fileBox.remoteUrl);
      fd.Content = fileBox.remoteUrl;
      fd.ContentType = mainType.image;
      sendMessageToAll({
        Type: SocketTypeEnum.RecordMsg,
        Data: JSON.stringify(fd),
      });
      // // 获取安全的文件名
      // const safeFileName = fileBox.name.replace(/\.[^/.]+$/, ""); // 去掉文件扩展名
      // const timestamp = dayjs().format("YYYYMMDDHHmmssSSS");
      // const relativePath = `../assets/images/${safeFileName}_${timestamp}.jpg`;
      // // 确保保存目录存在
      // const dirPath = path.join(__dirname, "..", "assets", "images");
      // if (!fs.existsSync(dirPath)) {
      //   fs.mkdirSync(dirPath); // 创建目录
      // }
      // // 生成完整的文件路径
      // const filePath = path.join(dirPath, `${safeFileName}_${timestamp}.jpg`);
      // // 保存文件
      // await fileBox.toFile(filePath);
      // console.log(`Image saved to ${relativePath}`);
    }

    if (msg.type() == bot.Message.Type.Video) {
      const fileBox = await msg.toFileBox();
      // console.log("获取到的文件流:", fileBox);
      console.log("视频地址", fileBox.remoteUrl);
      fd.Content = fileBox.remoteUrl;
      fd.ContentType = mainType.video;
      sendMessageToAll({
        Type: SocketTypeEnum.RecordMsg,
        Data: JSON.stringify(fd),
      });
      // /
      // console.log("获取到的文件流:", fileBox);
      // console.log(fileBox.remoteUrl);
      // 获取安全的文件名
      // const safeFileName = fileBox.name.replace(/\.[^/.]+$/, ""); // 去掉文件扩展名
      // const timestamp = dayjs().format("YYYYMMDDHHmmssSSS");
      // const relativePath = `../assets/videos/${safeFileName}_${timestamp}.mp4`;
      // // 确保保存目录存在
      // const dirPath = path.join(__dirname, "..", "assets", "videos");
      // if (!fs.existsSync(dirPath)) {
      //   fs.mkdirSync(dirPath); // 创建目录
      // }
      // // 生成完整的文件路径
      // const filePath = path.join(dirPath, `${safeFileName}_${timestamp}.mp4`);
      // // 保存文件
      // await fileBox.toFile(filePath);
      // console.log(`Video saved to ${relativePath}`);
    }
    if (msg.type() == bot.Message.Type.Attachment) {
      const fileBox = await msg.toFileBox();
      console.log("获取到的文件流:", fileBox);
      console.log("文档地址", fileBox.remoteUrl);
      fd.Content = fileBox.remoteUrl;
      fd.ContentType = mainType.documents;
      sendMessageToAll({
        Type: SocketTypeEnum.RecordMsg,
        Data: JSON.stringify(fd),
      });
    }
    if (msg.type() == bot.Message.Type.Audio) {
      const fileBox = await msg.toFileBox();
      // console.log("获取到的文件流:", fileBox);
      console.log("获取到的文件流远程路径地址:", fileBox.remoteUrl);
      fd.Content = fileBox.remoteUrl;
      fd.ContentType = mainType.Audio;
      sendMessageToAll({
        Type: SocketTypeEnum.RecordMsg,
        Data: JSON.stringify(fd),
      });
      // const mp3Stream = await getMp3Stream(fileBox.remoteUrl);
      // console.log("mp3Stream文件流: ", mp3Stream);

      // 获取安全的文件名
      // const safeFileName = fileBox.name.replace(/\.[^/.]+$/, ""); // 去掉文件扩展名
      // const timestamp = dayjs().format("YYYYMMDDHHmmssSSS");
      // const relativePath = `../assets/audios/${safeFileName}_${timestamp}.sil`;

      // // 输入和输出文件路径
      // // const inputFilePath = path.join(__dirname, "input.sil");
      // // const outputFilePath = path.join(__dirname, "output.mp3");
      // // 确保保存目录存在
      // const dirPath = path.join(__dirname, "..", "assets", "audios");
      // if (!fs.existsSync(dirPath)) {
      //   fs.mkdirSync(dirPath); // 创建目录
      // }
      // // 生成完整的文件路径
      // const filePath = path.join(dirPath, `${safeFileName}_${timestamp}.sil`);
      // // 保存文件
      // await fileBox.toFile(filePath);
      // console.log(`Audios saved to ${relativePath}`);
    }
  } else {
    /**个人私聊 */
    // await msg.say(`${sender.name()} 你好\n ${JSON.stringify(sender)}`);
    /**查看这条消息是否为/机器人发送的。 */
    if (msg.self()) {
      // console.log();
      return;
    }

    // console.log(msg.toString(), "接受到的文本信息", msg.type());
    switch (msg.type()) {
      case bot.Message.Type.Audio:
        /**音频 */
        // 检查文件夹是否存在，如果不存在则创建
        const dir = "./server/received_audio";
        console.log(fs.existsSync(dir), "fs.existsSync(dir)");
        if (!fs.existsSync(dir)) {
          fs.mkdirSync(dir);
        }
        // 获取音频文件
        const fileBox = await msg.toFileBox();
        const safeFileName = sanitizeFileName(sender.name());
        const filePath = `./server/received_audio/${safeFileName}_${dayjs().format(
          "YYYYMMDDHHmmssSSS"
        )}.mp3`;
        try {
          await fileBox.toFile(filePath);
        } catch (error) {
          console.error(`audio音频缓存报错: ${error.message}`);
        }
        console.log("发送人的信息", sender);
        console.log("发送的内容", msg);
        console.log(`Audio saved to: ${filePath}`);
        // 回复确认消息
        await msg.say("Audio received!");
        break;
      case bot.Message.Type.Text:
        /**文本 */
        console.log(await bot.Room.findAll());
        if (await isAddRoom(msg, bot)) return;
        if (await isRoomName(msg, bot)) return;
        if (await isChuxing(msg, bot)) return;
        break;
      default:
        break;
    }
    if (msg.text().trim() == "ding") {
      await msg.say("dong");
    }
  }

  /**消息的时间差 */
  if (msg.age() > 2 * 60) {
    // console.log(chalk.white.red.bold("消息被丢弃，因为它太旧（超过 2 分钟）"));
    return;
  }
};

export default mMsg;
